通过,往表单实例的,SelectField choices 传值,会导致,所选中的值,不在原表单对象里的choise 值内,而报,SelectField未传值的错误。
网上,好多大神,发表此类问题,但没有更好的解决办法,此问题就此放置。
等待后期修复,或找到更好的解决方法。
网上,推荐使用普通 自定义的field 来实现。
最终得到解决:
曾经的尝试:
def validate(self, extra_validators=None):
if extra_validators is not None:
extra = extra_validators.copy()
else:
extra = {}
# 想办法重写 room_id的验证方式
for name in self._fields:
inline = getattr(self.__class__, f"validate_{name}", None)
if inline is not None:
extra.setdefault(name, []).append(inline)
print(extra,super().validate(extra))
extra_validators = extra
# return super().validate(extra)
# 下面是父级 验证器
success = True
for name, field in self._fields.items():
if extra_validators is not None and name in extra_validators:
extra = extra_validators[name]
else:
extra = tuple()
print(name, field, extra)
if not field.validate(self, extra): # and name != 'room_id': # 强改
print(field,'有问题了......')
success = False
return success借鉴所得:
# 表单类中的新增
def __init__(self, *args, **kwargs):
super(Room_insert_holds, self).__init__(*args, **kwargs)
print(kwargs)
if kwargs.get('rooms'):
print("---",type(kwargs.get('rooms')))
self.room_id.choices = kwargs.get('rooms')
if kwargs.get('formdata'):
print("---",type(kwargs.get('formdata')))
self.formdata = kwargs.get('formdata')
# self.city.choices = ((1, '篮球'), (2, '足球'), (3, '羽毛球'))
视图类中增加:
dict ={
'rooms' : rooms, 'formdata' : request.form
}
form = Room_insert_holds(**dict)
无论是get还是post,都要使用。
否则报错。
这里就完整实现了,动态改变 SelectField choices 值的目的。
此问题,困扰了一天了,终于在睡觉前,解决了。感谢大神的心得:https://www.bbsmax.com/A/lk5aMwDm51/
补充一下:
表单类中:
def __init__(self, *args, **kwargs):
super(Room_insert_holds, self).__init__(*args, **kwargs)
print(kwargs)
if kwargs.get('rooms'):
print("---",type(kwargs.get('rooms')))
self.room_id.choices = kwargs.get('rooms')
# 可以注释掉
# if kwargs.get('formdata'):
# print("---",type(kwargs.get('formdata')))
# self.formdata = kwargs.get('formdata')
# self.city.choices = ((1, '篮球'), (2, '足球'), (3, '羽毛球'))
# 为什么说可以注释掉,不用这样多此一举,像引用老师心得那样呢?
# 咱们看原码:
在flalsk-wtf ,FlaskForm方法内72行,__init__方法代码:
def __init__(self, formdata=_Auto, **kwargs):
super().__init__(formdata=formdata, **kwargs)
# 默认情况下,是不需要对formdata,单独进行赋值处理。特殊情况下,肯定是可以的。
# 这也保留了灵活性。也希望,后期的项目中能用得上